/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modele;

import java.lang.String;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * DatabaseManager
 * @author Théo
 */
public class DatabaseManager {

    /**
     * Retourne la liste des tables de la base de données
     * @return Les tables de la base de données
     */
    public static List<String> getLstTables() {
        List<String> lstTables = new ArrayList<String>();
        Connection connexion = Database.getInstance().getConnection();
        ResultSet rs = null;

        try {
            DatabaseMetaData dbmd = connexion.getMetaData();
            rs = dbmd.getTables(null, null, null, new String[]{"TABLE"});

            while (rs.next()) {
                lstTables.add(rs.getString("TABLE_NAME"));
            }

        } catch (SQLException ex) {
            Logger.getLogger(DatabaseManager.class.getName()).log(Level.SEVERE, null, ex);
        }

        return lstTables;
    }

    /**
     * Retourne la liste des colonnes pour une table donnée
     * @param table La table dont on recherche les colonnes
     * @return La liste des colonnes de la table recherchée
     */
    public static List<String> getLstColumns(String table) {
        List<String> lstTables = new ArrayList<String>();
        Connection connexion = Database.getInstance().getConnection();
        ResultSet rs = null;

        try {
            Statement st = connexion.createStatement();
            rs = st.executeQuery("SELECT * FROM " + table);
            ResultSetMetaData md = rs.getMetaData();

            for (int i = 1; i <= md.getColumnCount(); ++i) {
                lstTables.add(md.getColumnName(i));
            }

        } catch (SQLException ex) {
            Logger.getLogger(DatabaseManager.class.getName()).log(Level.SEVERE, null, ex);
        }

        return lstTables;
    }

    /**
     * Effectue une requête standard de sélection sur une colonne
     * @param table La table sur laquelle effectuer la sélection
     * @param col Le nom de la colonne à sélectionner
     * @return Le contenu de la colonne
     */
    public static List<String> getTableByField(String table, String col) {
        List<String> lstLines = new ArrayList<String>();
        Connection connexion = Database.getInstance().getConnection();
        ResultSet rs = null;

        try {
            String sql = "SELECT " + col + " FROM " + table;
            Statement stmt = connexion.createStatement();
            rs = stmt.executeQuery(sql);

            while (rs != null && rs.next()) {
                lstLines.add(rs.getString(col));
            }
        } catch (SQLException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            Database.getInstance().close(connexion);
        }

        return lstLines;
    }

    public static List<String> getDatabases() {
        List<String> lstDatabases = new ArrayList<String>();

        ResultSet rs;
        try {
            rs = Database.getInstance().getConnection().getMetaData().getCatalogs();
            while (rs.next()) {
                lstDatabases.add(rs.getString("TABLE_CAT"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseManager.class.getName()).log(Level.SEVERE, null, ex);
        }

        return lstDatabases;
    }
}
